# -- coding: utf-8 --
# @time :
# @author : 周梦泽
# @file : .py
# @software: pycharm
"""
hyc_main_run.py
行业词的主运行文件
"""
from common.utils.ExcelUtil import del_english_keywords
from config import data as yaml_data
import pandas as pd
from common.logger.log import log_
import os
from common.utils.CacheUtil import init_cache


class DataClean:
    def __init__(self):
        """
        初始化变量
        """
        self.path = yaml_data.get('download_path.path') + 'hyc/hyc_data'
        current_dir = os.path.dirname(os.path.abspath(__file__))
        self.folder_path = os.path.abspath(os.path.join(current_dir, '../../../../../../' + self.path))
        pd.options.mode.chained_assignment = None  # 默认为 warn，可以设置为 None 表示忽略警告
        pd.set_option('mode.chained_assignment', None)  # 与上面的设置方式等价

    def read_csv(self) -> pd.DataFrame:
        """
        读取csv文件
        :return:
        """
        files = os.listdir(self.folder_path)
        csv_files = [file for file in files if file.endswith('.csv')]
        # 遍历筛选出文件夹下的csv文件
        dfs = []
        total_df = None
        if len(csv_files) == 0:
            log_.error('文件夹中没有csv文件')
            raise FileNotFoundError
        elif len(csv_files) > 0:
            if len(csv_files) > 1:
                log_.warning('文件夹中存在多个csv文件')
            for csv_file in csv_files:
                dfs.append(pd.read_csv(os.path.join(self.folder_path, csv_file), encoding='utf-8'))
                # 读取所有csv文件,并将其添加到列表中
                total_df = pd.concat(dfs, ignore_index=True)
                # ignore_index = true 生成新的索引
            return total_df

        else:
            log_.error('未知错误')
            raise Exception("未知错误")

    def data_tidy(self, params):
        """
        1、关键词block_words过滤
        2、按 搜索人数 降序排列
        3、搜索人数大于search_num的标记
        4、支付转换率大于pay_rate的标记
        5、支付人数大于num_of_pay的标记
        6、如果三个列都标记的把关键词也标记
        :param params:参数包含
            search_num:搜索人数比较值
            pay_rate:支付转换率比较值
            num_of_pay:支付人数比较值
            block_words:关键词过滤
        :return:
        """
        log_.info('参数初始化')
        search_num = float(params.get('searchNum'))
        pay_rate = float(params.get('payRate'))
        num_of_pay = float(params.get('numOfPay'))
        block_words = params.get('blockWords')
        rm_english = params.get('rmEnglish')

        cache_table = init_cache(params)
        result = cache_table.get_search_key_df(key_type="ssph")
        if result is None:
            # 先读取缓存，如果缓存中没有数据，再读取csv文件
            log_.info('开始整合数据')
            total_df = self.read_csv()
            cache_table.put_cache_by_df(key_type="ssph", df=total_df)
        #     更新缓存
        else:
            log_.info('使用缓存')
            total_df = result
            # total_df.to_csv('临时.csv')
            # print(total_df)

        log_.info('正在去除空值')
        # total_df = total_df.replace('_', np.nan)
        total_df.replace('-', float('nan'), inplace=True)
        total_df = total_df.dropna(subset=['支付转化率'], how='any').sort_values(by='搜索人数', ascending=False)
        # dropna()方法并指定subset参数为包含所有要清除空值的列名的列表，然后指定how = 'any'表示只要任何一个列中存在空值就清除该行。
        # sort_values()方法并指定by参数为包含所有要排序的列名的列表，然后指定ascending参数为True表示升序排列。
        # data_df = dropna_df[~dropna_df['支付转化率'].isin(['-'])]
        # print(dropna_df[dropna_df['支付转化率'].isin(['-'])])
        log_.info('开始关键词过滤')
        mask = False
        for block_word in block_words:
            mask |= total_df['关键词'].str.contains(block_word)
        data_df = total_df[~mask]
        log_.info('开始按条件将数据标红')
        data_df['支付转化率'] = data_df['支付转化率'].str.rstrip('%').astype('float')
        if rm_english:
            # 用户选择删除关键词中的英文
            log_.info('删除关键词中的英文')
            data_df = del_english_keywords(data_df, '关键词')

        data_df.reset_index(drop=True, inplace=True)
        # 重置索引,要不然在生成表格时会报错
        flag = (data_df['搜索人数'] > search_num) & (data_df['支付转化率'] > pay_rate) & (
                data_df['支付人数'] > num_of_pay)
        styler = data_df.style.applymap(self.highlight_red_font, num=search_num, subset=['搜索人数']) \
            .applymap(self.highlight_red_font, num=pay_rate, subset=['支付转化率']) \
            .applymap(self.highlight_red_font, num=num_of_pay, subset=['支付人数']) \
            .applymap(lambda x: 'color: red' if x in data_df.loc[flag, '关键词'].tolist() else '')

        # 文件设置样式并保存
        # date_time_string = datetime.today().strftime('%Y-%m-%d_%H-%M-%S')
        # file_name = f'hyc_data_{date_time_string}.xlsx'
        # with pd.ExcelWriter(self.folder_path + '/result/{}'.format(file_name)) as writer:
        #     styler.to_excel(writer, sheet_name='市场排行版词', index=False)
        # log_.info('文件路径：{}'.format(self.folder_path + '/result/{}'.format(file_name)))
        # data_df.to_excel(self.folder_path + '/result/{}'.format(file_name), index=False)
        return data_df, styler

    @staticmethod
    def highlight_red_font(x, num):
        """
        :param x:单元格，不需要传，applymap方法会自动将表格中的每个单元格传入
        :param num:比较值
        :return:
        """
        if x >= num:
            return 'color: red'
        else:
            return ''
